/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gee.util;

/**
 *
 * @author CoCo
 */
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import java.util.*;

public class StringUtil {

	/**
	 * 在制定矩形内,绘制折行文本,超出矩形范围的字符不显示
	 * 
	 * @param src
	 *            文本字串
	 * @param g
	 *            Graphics对象
	 * @param x
	 *            矩形左上角x坐标
	 * @param y
	 *            矩形左上角y坐标
	 * @param w
	 *            矩形宽度
	 * @param h
	 *            矩形高度
	 * @param leftMargin
	 *            左边矩
	 * @param topMargin
	 *            上边距
	 * @param isVTight
	 *            行间距是否紧凑
	 * @param fontColor
	 *            文字颜色
	 * @param font
	 *            绘制所用字体
	 */
	public static final void drawWrapString(String src, Graphics g, int x,
			int y, int w, int h, int leftMargin, int topMargin,
			boolean isVTight, int fontColor, Font font) {
		g.setFont(font);
		g.setColor(fontColor);
		int count = src.length();
		int curCharIndex = 0;
		int curX = x + leftMargin;
		int curY = y + topMargin;
		int vDelta = font.getHeight();
		if (isVTight) {
			vDelta = font.getBaselinePosition();
		}
		while (curCharIndex < count) {
			char c = src.charAt(curCharIndex);
			if (c == '\n') {
				curX = x + leftMargin;
				curY += vDelta;
				curCharIndex++;
				continue;
			} else if (c == '\t') {
				// 相当于2个空格
				curX += font.charWidth(' ') * 2;
				curCharIndex++;

				continue;
			}

			if (curX + font.charWidth(c) < x + w) {

				g.drawChar(c, curX, curY, Graphics.LEFT | Graphics.TOP);
				curCharIndex++;
				curX += font.charWidth(c);

			} else {
				// 考虑换行
				if (curY + 2 * font.getBaselinePosition() < y + h) {
					curY += vDelta;
					curX = x + leftMargin;
					g.drawChar(c, curX, curY, Graphics.LEFT | Graphics.TOP);
					curCharIndex++;
					curX += font.charWidth(c);
				} else {
					break;
				}
			}
		}
	}

	// 字符串分割技术（高效精确）
	//
	// 用法：参数定义：str——要分割的字符串
	// font——字体
	// rowMaxW——分割后每行宽度
	// 支持标示符：
	// \n 换行
	// \t 插入两个汉字长度的空格
	// 返回结果是一个已切割好的String数组，只要用一个循环打印出来就可以了

	public static final String[] clipString(String str, Font font, int rowMaxW) {
		if (str == null) {
			return null;
		}
		if (rowMaxW < font.charWidth('哈')) {
			rowMaxW = font.charWidth('哈');
		}
		int strID = 0;
		int rowW = 0;
		Vector strManager = new Vector();
		char ch = ' ';
		while (str.length() > strID) {
			ch = str.charAt(strID);
			switch (ch) {
			case '\n':
				strManager.addElement(str.substring(0, strID));
				str = str.substring(strID + 1);
				rowW = 0;
				strID = 0;
				break;
			case '\t':
				StringBuffer sb = new StringBuffer(str);
				sb.deleteCharAt(strID);
				sb.insert(strID, "       ");
				str = sb.toString();
				break;
			default:
				if (rowW + font.charWidth(ch) > rowMaxW) {
					strManager.addElement(str.substring(0, strID));
					str = str.substring(strID);
					rowW = 0;
					strID = 0;
				} else {
					rowW += font.charWidth(ch);
					strID++;
				}
			}
		}
		strManager.addElement(str);
		String[] o_Str = new String[strManager.size()];
		strManager.copyInto(o_Str);
		return o_Str;
	}

	// 参数定义：clipStr——先前分割好的字符串数组
	// font——字体
	// color——颜色
	// x,y——打印的屏幕位置
	//
	// 注意，切割和打印函数的字体参数必须保持一致！
	//

	public static final void drawClipString(Graphics g, String[] clipStr,
			Font font, int color, int x, int y) {
		if (clipStr == null) {
			System.out.println("drawClipString");
			return;
		}
		int FONTH = font.getHeight();
		g.setFont(font);
		g.setColor(color);
		for (int i = 0; i < clipStr.length; i++) {
			g.drawString(clipStr[i], x, y + i * FONTH, 0);
		}
	}

	/**
	 * @todo 对一段文字进行分行，这种分行是针对于某个字体的
	 * @author efei
	 * @param strSource
	 *            String 待分行的字符串
	 * @param font
	 *            Font 使用的字体
	 * @param width
	 *            int 分行后需要满足的宽度
	 * @param strSplit
	 *            String 断词判断字符，如空格和一些标点符号。中文不需要断词，则传空字符串
	 * @return Vector
	 */
	public Vector getSubsection(String strSource, Font font, int width,
			String strSplit) {
		Vector vector = new Vector();
		String temp = strSource;
		int i, j;
		int LastLength = 1;
		int step = 0;
		try {
			while (!temp.equals("")) {
				i = temp.indexOf("\n");
				if (i > 0) {
					if (font.stringWidth(temp.substring(0, i - 1)) >= width) {
						i = -1;
					}
				}
				if (i == -1) {
					if (LastLength > temp.length()) {
						i = temp.length();
					} else {
						i = LastLength;
						step = font.stringWidth(temp.substring(0, i)) > width ? -1
								: 1;
						// 得到临界点
						if (i < temp.length()) {
							while (!(font.stringWidth(temp.substring(0, i)) <= width && font
									.stringWidth(temp.substring(0, i + 1)) > width)) {
								i = i + step;
								if (i == temp.length()) {
									break;
								}
							}
						}
					}
					// 断词，如果需要的话
					if (!strSplit.equals("")) {
						j = i; // 把初始值记录下来，是因为有可能出现一种情况，这种情况就是这一行只有这么一个单词，会一直搜索到头
						if (i < temp.length()) {
							while (strSplit.indexOf(temp.substring(i - 1, i)) == -1) {
								i--;
								if (i == 0) {
									i = j; // 恢复
									break;
								}
							}
						}
					}
				}
				LastLength = i;
				vector.addElement(temp.substring(0, i));
				if (i == temp.length()) {
					temp = "";
				} else {
					temp = temp.substring(i);
					if (temp.substring(0, 1).equals("\n")) {
						temp = temp.substring(1);
					}
				}
			}
		} catch (Exception e) {
			System.out.println("getSubsection:" + e);
		}
		return vector;
	}
	// 使用示例
	// ：
	// int gintLineHeight = 15;//全局变量，行高
	// int gintBeginIndex = 0;//全局变量，在keyPressed里改变它的值，便可以实现上下翻页
	// String str = "方便起见，可以定义一个行高作为全局变量，这样比较好，写个简单的例子："
	// Vector vector = getSubsection(str, Font.getDefaultFont(), getWidth(),
	// "");
	// for
	//
	//
	// (
	//
	//
	//
	// int i=gintBeginIndex;i<vector.size();i++){
	// g.drawString((String)vector.elementAt(i),0, gintLineHeight * i, 0);
	// if ((i - mintBeginIndex + 1) * gintLineHeight > getHeight()) {
	// break;
	// }
	// }
	// vector = null;
}
